iT邦幫忙

0

資料庫設計 (六) - 第一正規化實務案例 : 學生

  • 分享至 

  • xImage
  •  

設計「學生」資料表

在上一篇文章了解了第一正規化(1NF)的基本原則後,讓我們透過一個實際案例來應用這些概念:設計一張學生資料表(students)。

初始設計:欄位與潛在問題

假設我們原本設計的學生資料表包含以下欄位:

  • 名字(first_name)
  • 姓氏(last_name)
  • 出生日期(birth_date)
  • 地址(address)

這樣的設計看似合理,但當我們問自己:「這些欄位的組合能否唯一識別每一筆學生資料?」答案是否定的。原因如下:

  • 有可能兩位學生同名同姓(如「John Smith」)。
  • 他們甚至可能出生在同一天。
  • 他們也可能住在相同地址,例如兄弟姊妹或室友。
  • 即使我們組合多個欄位來當主鍵,例如「名字 + 姓氏 + 出生日期」,還是無法保證唯一性。

這代表這張表不符合 1NF 的要求,因為沒有明確的唯一識別欄位。

引入主鍵欄位(Primary Key)

為了解決這個問題,我們應該新增一個能夠唯一識別每筆學生資料的欄位,也就是主鍵(Primary Key)。最常見的做法是建立一個名為 student_id 的欄位:

student_id first_name last_name birth_date address
1 John Smith 2000-05-12 address

這個 student_id 應具備以下特性:

  • 唯一(Unique):每個學生都有不同的 ID。
  • 不可為空(NOT NULL)。
  • 不會頻繁變動。

這樣一來,我們就能透過 student_id 來唯一識別每一筆學生資料,滿足第一正規化的基本條件。

拆解非原子欄位

接下來,我們發現 address 欄位本身其實是一個「複合欄位」,它可能包含以下資訊:

  • 門牌號(unit_number)
  • 街道號碼(street_number)
  • 街道名稱(street_name)
  • 城市(city)
  • 州/縣市(state/province)
  • 郵遞區號(postal_code)
  • 國家(country)

這樣的複合資料應該拆解為多個欄位,才符合 1NF 中「欄位必須是原子值」的要求。更新後的表格如下:

student_id first_name last_name birth_date unit_number street_number street_name city state postal_code country
1 John Smith 2000-05-12 3A 25 Roosevelt Rd Taipei Taipei 100 Taiwan

總結

透過這個例子,我們可以總結出第一正規化應包含以下實務重點:

  • 為每一筆資料設計主鍵,保證唯一識別。
  • 避免複合欄位或多值欄位,確保每個欄位都是原子值。
  • 適當拆解複雜欄位(如地址),讓資料更易於查詢與維護。

這樣的設計方式不僅能提升資料一致性與完整性,也為資料庫後續的擴展與維護打下良好基礎。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言